// 1. 根据以下代码写出es5的
// class Example {
//   constructor(name) {
//     this.name = name;
//   }
//   init() {
//     const fun = () => {
//       console.log(this.name);
//     };
//     fun();
//   }
// }
// const e = new Example("Hello");
// console.log(e);
// e.init();

// function checkThis(target, constructor) {
//   return target instanceof constructor;
// }

// function creteClass(obj, props) {
//   for (index in props) {
//     const key = props[index].key;
//     Object.defineProperty(obj, key, { ...props[index].des });
//   }
// }

// function Example(name) {
//   "use strict";
//   // class只允许通过new来调用
//   if (!checkThis(this, Example)) {
//     throw new Error("请通过new来调用构造函数");
//   }
//   this.name = name;

//   //挂载 init方法，且不可枚举
//   creteClass(this, [
//     {
//       key: "init",
//       des: {
//         value: function () {
//           if (new.target) {
//             throw new Error("es6中class的原型上的方法，不允许通过new来调用");
//           }
//           const fun = () => {
//             console.log(this.name);
//           };
//           fun();
//         },
//       },
//     },
//   ]);
// }

// const ex = new Example("haha");
// console.log(ex);
// ex.init();

// function Example(name) {
//   "use strict";

//   console.log("new-->", new.target);
//   if (!new.target) {
//     throw new TypeError("Class constructor cannot be invoked whthout new ");
//   }

//   this.name = name;
// }

// Object.defineProperty(Example.prototype, "init", {
//   enumerable: false,
//   value: function () {
//     if (new.target) {
//       throw new TypeError("init is not a constructor");
//     }

//     var fun = () => {
//       console.log(this.name);
//     };
//   },
// });
